﻿package frEngine.animateControler.particleControler.animate
{
    import __AS3__.vec.*;
    import flash.geom.*;
    import frEngine.animateControler.particleControler.*;
    import frEngine.shader.filters.*;

    public class UseLineSpeed extends Object implements IParticleAnimate
    {
        private var particlelineSpeed:Vector.<Vector3D>;
        private var _isOpen:Boolean = false;
        private var _useFriction:Boolean;
        private var _frictionSizeX:Number;
        private var _frictionSizeY:Number;
        private var _frictionSizeZ:Number;
        public static const instance:UseLineSpeed = new UseLineSpeed;

        public function UseLineSpeed()
        {
            return;
        }// end function

        public function get objClass() : Class
        {
            return UseLineSpeed;
        }// end function

        public function canOpen(param1:ParticleParams) : Boolean
        {
            return true;
        }// end function

        public function init(param1:ParticleStatus, param2:ParticleParams) : void
        {
            var _loc_9:XYZObject = null;
            var _loc_10:ParticleItem = null;
            var _loc_11:Vector3D = null;
            this._isOpen = param2.useSpeed;
            if (!this._isOpen)
            {
                return;
            }
            this._useFriction = param2.useFriction;
            if (this._useFriction)
            {
                _loc_9 = param2.frictionVecor3d;
                var _loc_12:int = 1;
                _loc_9.x = 1;
                var _loc_12:int = 1;
                _loc_9.y = 1;
                var _loc_12:int = 1;
                _loc_9.z = 1;
                this._frictionSizeX = 1000 / _loc_9.x;
                this._frictionSizeY = 1000 / _loc_9.y;
                this._frictionSizeZ = 1000 / _loc_9.z;
            }
            var _loc_3:* = param2.surfaceData["" + FilterName_ID.PARAM2_ID + ":3:true"];
            var _loc_4:* = param2.numOfmeshVertex;
            var _loc_5:int = 0;
            var _loc_6:* = param1.particleList;
            var _loc_7:* = _loc_6.length;
            var _loc_8:int = 0;
            while (_loc_8 < _loc_7)
            {
                
                _loc_10 = _loc_6[_loc_8];
                _loc_11 = _loc_10.lineSpeed;
                _loc_5 = _loc_8 * _loc_4 * 3;
                _loc_11.x = _loc_3[_loc_5++];
                _loc_11.y = _loc_3[_loc_5++];
                _loc_11.z = _loc_3[_loc_5++];
                _loc_8++;
            }
            return;
        }// end function

        private function isOen(param1:ParticleStatus) : void
        {
            var _loc_4:uint = 0;
            var _loc_5:Vector3D = null;
            var _loc_6:Vector3D = null;
            var _loc_7:Vector3D = null;
            var _loc_8:ParticleItem = null;
            var _loc_9:int = 0;
            var _loc_10:Number = NaN;
            var _loc_11:Number = NaN;
            var _loc_12:Number = NaN;
            var _loc_13:Number = NaN;
            var _loc_14:Number = NaN;
            var _loc_15:Number = NaN;
            var _loc_2:* = param1.particleList;
            var _loc_3:* = _loc_2.length;
            if (this._useFriction)
            {
                _loc_9 = 0;
                while (_loc_9 < _loc_3)
                {
                    
                    _loc_8 = _loc_2[_loc_9];
                    if (_loc_8.visible && _loc_8.toUpdate)
                    {
                        _loc_4 = _loc_8.curFrame;
                        _loc_5 = _loc_8.lineSpeed;
                        _loc_6 = _loc_8.resultPos;
                        _loc_7 = _loc_8.posOffset;
                        _loc_10 = _loc_4 < this._frictionSizeX ? (_loc_4) : (this._frictionSizeX);
                        _loc_11 = _loc_4 < this._frictionSizeY ? (_loc_4) : (this._frictionSizeY);
                        _loc_12 = _loc_4 < this._frictionSizeZ ? (_loc_4) : (this._frictionSizeZ);
                        _loc_13 = _loc_5.x / this._frictionSizeX;
                        _loc_14 = _loc_5.y / this._frictionSizeY;
                        _loc_15 = _loc_5.z / this._frictionSizeZ;
                        _loc_6.x = _loc_5.x * _loc_10 - 0.5 * _loc_13 * _loc_10 * _loc_10 + _loc_7.x;
                        _loc_6.y = _loc_5.y * _loc_11 - 0.5 * _loc_14 * _loc_11 * _loc_11 + _loc_7.y;
                        _loc_6.z = _loc_5.z * _loc_12 - 0.5 * _loc_15 * _loc_12 * _loc_12 + _loc_7.z;
                    }
                    _loc_9++;
                }
            }
            else
            {
                _loc_9 = 0;
                while (_loc_9 < _loc_3)
                {
                    
                    _loc_8 = _loc_2[_loc_9];
                    if (_loc_8.visible && _loc_8.toUpdate)
                    {
                        _loc_4 = _loc_8.curFrame;
                        _loc_5 = _loc_8.lineSpeed;
                        _loc_6 = _loc_8.resultPos;
                        _loc_7 = _loc_8.posOffset;
                        _loc_6.x = _loc_5.x * _loc_4 + _loc_7.x;
                        _loc_6.y = _loc_5.y * _loc_4 + _loc_7.y;
                        _loc_6.z = _loc_5.z * _loc_4 + _loc_7.z;
                    }
                    _loc_9++;
                }
            }
            return;
        }// end function

        private function isClosed(param1:ParticleStatus) : void
        {
            var _loc_4:Vector3D = null;
            var _loc_5:Vector3D = null;
            var _loc_6:Vector3D = null;
            var _loc_7:ParticleItem = null;
            var _loc_8:int = 0;
            var _loc_2:* = param1.particleList;
            var _loc_3:* = _loc_2.length;
            _loc_8 = 0;
            while (_loc_8 < _loc_3)
            {
                
                _loc_7 = _loc_2[_loc_8];
                if (_loc_7.visible && _loc_7.toUpdate)
                {
                    _loc_4 = _loc_7.resultPos;
                    _loc_6 = _loc_7.posOffset;
                    _loc_4.x = _loc_6.x;
                    _loc_4.y = _loc_6.y;
                    _loc_4.z = _loc_6.z;
                }
                _loc_8++;
            }
            return;
        }// end function

        public function update(param1:ParticleStatus) : void
        {
            if (this._isOpen)
            {
                this.isOen(param1);
            }
            else
            {
                this.isClosed(param1);
            }
            return;
        }// end function

    }
}
